// cart/index.js
const api = require('../../utils/api')
const config = require('../../utils/config')
const { checkLogin, showToast } = require('../../utils/util')
const app = getApp();

Page({
  data: {
    loading: true,
    cartList: [],
    selectedAll: false,
    totalPrice: 0.00,
    selectedCount: 0,
    isEmpty: false,
    isLoggedIn: false,
    address: null
  },

  onLoad: function() {
    console.log('[购物车] 页面加载')
    this.checkLoginStatus()
  },

  onShow: function() {
    console.log('[购物车] 页面显示')
    this.checkLoginStatus()
    if (typeof this.getTabBar === 'function') {
      this.getTabBar().setData({ selected: 2 })
    }
  },

  onPullDownRefresh: function() {
    this.fetchCartList()
    wx.stopPullDownRefresh()
  },

  // 检查登录状态
  checkLoginStatus: function() {
    const isLoggedIn = checkLogin()
    console.log('[购物车] 登录状态:', isLoggedIn)
    this.setData({ isLoggedIn })
    
    if (isLoggedIn) {
      this.fetchDefaultAddress()
      this.fetchCartList()
    } else {
      this.setData({ loading: false })
    }
  },

  // 跳转到登录页
  navigateToLogin: function() {
    wx.navigateTo({
      url: '/pages/login/index'
    })
  },

  // 跳转到首页
  navigateToHome: function() {
    wx.switchTab({
      url: '/pages/index/index'
    })
  },

  // 获取默认收货地址
  fetchDefaultAddress: function() {
    // 从本地存储获取默认地址
    const address = wx.getStorageSync('selected_address')
    if (address) {
      this.setData({ address })
      console.log('[购物车] 已获取地址:', address)
      return;
    }
    
    const token = wx.getStorageSync('token');
    if (!token) {
      console.log('[购物车] 未登录，无法获取默认地址');
      return;
    }
    
    // 从服务器获取默认地址
    request({
      url: '/addresses/default',
      method: 'GET',
      showError: false, // 不显示错误提示
    }).then(res => {
      if (res.code === 200 && res.data) {
        this.setData({ address: res.data });
        wx.setStorageSync('selected_address', res.data);
        console.log('[购物车] 已获取默认地址:', res.data);
      } else {
        console.log('[购物车] 未找到默认地址');
        // 没有默认地址不需要特殊处理，直接留空
      }
    }).catch(err => {
      // 获取地址失败，但不影响主功能，只记录日志
      console.log('[购物车] 获取默认地址失败:', err);
    });
  },

  // 选择收货地址
  chooseAddress: function() {
    // 先判断是否登录
    const token = wx.getStorageSync('token');
    if (!token) {
      wx.navigateTo({ url: '/pages/my/index' });
      return;
    }
    
    // 跳转到地址管理页面
    wx.navigateTo({
      url: '/pages/address/index?from=cart'
    });
  },

  // 获取购物车列表
  fetchCartList: function() {
    this.setData({ loading: true })
    console.log('[购物车] 开始获取购物车列表')
    
    api.get(config.API.CART.LIST)
      .then(res => {
        console.log('[购物车] 获取购物车列表成功:', res)
        
        if (res.code === 200) {
          const cartList = res.data || []
          // 为每个商品添加选中状态
          cartList.forEach(item => {
            item.selected = true
          })
          
          const isEmpty = cartList.length === 0
          
          this.setData({
            cartList,
            isEmpty,
            loading: false,
            selectedAll: !isEmpty // 默认全选
          })
          
          // 计算总价和已选商品数量
          this.calculateTotal()
        } else {
          showToast('获取购物车失败: ' + (res.message || '未知错误'))
          this.setData({ loading: false, isEmpty: true })
        }
        
        // 添加调试日志，检查结算栏显示条件
        console.log('[购物车] 结算栏显示条件检查:', {
          isLoggedIn: this.data.isLoggedIn,
          isEmpty: this.data.isEmpty,
          loading: this.data.loading,
          shouldShowCheckoutBar: this.data.isLoggedIn && !this.data.isEmpty && !this.data.loading
        })
      })
      .catch(err => {
        console.error('[购物车] 获取购物车列表失败:', err)
        console.error('[购物车] 错误详情:', {
          status: err.statusCode || '未知状态码',
          message: err.errMsg || '未知错误信息',
          data: err.data || '无错误数据'
        })
        showToast('获取购物车失败，请稍后再试')
        this.setData({ loading: false, isEmpty: true })
      })
  },

  // 更新商品选中状态
  selectItem: function(e) {
    const index = e.currentTarget.dataset.index
    const cartList = this.data.cartList
    cartList[index].selected = !cartList[index].selected
    
    // 检查是否所有商品都被选中
    const selectedAll = cartList.every(item => item.selected)
    
    this.setData({
      cartList,
      selectedAll
    })
    
    this.calculateTotal()
  },

  // 全选/取消全选
  selectAll: function() {
    const selectedAll = !this.data.selectedAll
    const cartList = this.data.cartList
    
    cartList.forEach(item => {
      item.selected = selectedAll
    })
    
    this.setData({
      selectedAll,
      cartList
    })
    
    this.calculateTotal()
  },

  // 增加商品数量
  increaseQuantity: function(e) {
    const index = e.currentTarget.dataset.index
    const cartList = this.data.cartList
    const item = cartList[index]
    
    // 限制最大数量为99
    if (item.quantity >= 99) {
      showToast('已达到最大购买数量')
      return
    }
    
    // 增加数量
    item.quantity += 1
    this.setData({ cartList })
    
    // 更新商品数量到服务器
    this.updateCartItemQuantity(item.id, item.quantity)
    
    // 重新计算总价
    this.calculateTotal()
  },

  // 减少商品数量
  decreaseQuantity: function(e) {
    const index = e.currentTarget.dataset.index
    const cartList = this.data.cartList
    const item = cartList[index]
    
    // 如果数量为1，则不继续减少
    if (item.quantity <= 1) {
      return
    }
    
    // 减少数量
    item.quantity -= 1
    this.setData({ cartList })
    
    // 更新商品数量到服务器
    this.updateCartItemQuantity(item.id, item.quantity)
    
    // 重新计算总价
    this.calculateTotal()
  },

  // 更新商品数量到服务器
  updateCartItemQuantity: function(itemId, quantity) {
    console.log('[购物车] 更新商品数量:', itemId, quantity)
    
    const url = config.API.CART.UPDATE_QUANTITY.replace(':id', itemId);
    api.put(url, {
      quantity: quantity
    })
      .then(res => {
        console.log('[购物车] 更新商品数量成功:', res)
        
        if (res.code !== 200) {
          showToast('更新数量失败')
          // 刷新购物车列表
          this.fetchCartList()
        }
      })
      .catch(err => {
        console.error('[购物车] 更新商品数量失败:', err)
        showToast('更新数量失败，请稍后再试')
        // 刷新购物车列表
        this.fetchCartList()
      })
  },

  // 删除商品
  deleteItem: function(e) {
    const index = e.currentTarget.dataset.index
    const item = this.data.cartList[index]
    
    console.log('[购物车] 准备删除商品:', item)
    
    wx.showModal({
      title: '提示',
      content: '确定要删除这个商品吗？',
      success: (res) => {
        if (res.confirm) {
          const url = config.API.CART.DELETE.replace(':id', item.id);
          api.delete(url)
            .then(res => {
              console.log('[购物车] 删除商品成功:', res)
              
              if (res.code === 200) {
                showToast('删除成功')
                // 重新获取购物车列表
                this.fetchCartList()
              } else {
                showToast('删除失败')
              }
            })
            .catch(err => {
              console.error('[购物车] 删除商品失败:', err)
              showToast('删除失败，请稍后再试')
            })
        }
      }
    })
  },

  // 计算总价和已选商品数量
  calculateTotal: function() {
    let totalPrice = 0
    let selectedCount = 0
    
    this.data.cartList.forEach(item => {
      if (item.selected) {
        totalPrice += item.price * item.quantity
        selectedCount += item.quantity
      }
    })
    
    // 保留两位小数
    totalPrice = parseFloat(totalPrice.toFixed(2))
    
    console.log('[购物车] 计算总价和已选商品数量:', totalPrice, selectedCount)
    
    this.setData({
      totalPrice,
      selectedCount
    })
  },

  // 结算
  checkout: function() {
    // 如果没有选中商品，则不能结算
    if (this.data.selectedCount <= 0) {
      showToast('请选择要结算的商品')
      return
    }
    
    // 如果没有收货地址，提示添加地址
    if (!this.data.address) {
      wx.showModal({
        title: '提示',
        content: '请先添加收货地址',
        confirmText: '去添加',
        success: (res) => {
          if (res.confirm) {
            this.chooseAddress()
          }
        }
      })
      return
    }
    
    // 获取已选择的商品
    const selectedItems = this.data.cartList.filter(item => item.selected)
    const cartIds = selectedItems.map(item => item.id)
    
    console.log('[购物车] 准备结算商品:', selectedItems)
    console.log('[购物车] 结算参数:', {
      cartIds: cartIds,
      addressId: this.data.address.id,
      remark: ''
    })
    
    wx.showLoading({
      title: '正在创建订单...',
      mask: true
    })
    
    // 调用创建订单API
    api.post(config.API.ORDER.CREATE, {
      cartIds: cartIds,
      addressId: this.data.address.id,
      remark: ''
    })
      .then(res => {
        wx.hideLoading()
        
        console.log('[购物车] 创建订单API响应:', res)
        console.log('[购物车] 状态码:', res.statusCode || res.code)
        
        // 处理成功状态 - 201表示创建成功，200表示成功
        if ((res.code === 200 || res.code === 201 || res.code === 0) && res.data) {
          // 获取订单ID，支持多种API响应格式
          const orderId = res.data.orderId || res.data.id || res.data
          console.log('[购物车] 订单创建成功，订单ID:', orderId)
          
          // 显示成功提示
          showToast('订单创建成功')
          
          // 跳转到支付页面
          setTimeout(() => {
            wx.navigateTo({
              url: `/pages/order/payment/index?id=${orderId}`
            })
          }, 300)
        } else {
          // 显示错误信息
          console.error('[购物车] 创建订单返回错误:', res)
          showToast(res.message || '创建订单失败')
        }
      })
      .catch(err => {
        wx.hideLoading()
        console.error('[购物车] 创建订单异常:', err)
        // 输出更详细的错误信息
        if (err.statusCode) {
          console.error('[购物车] HTTP状态码:', err.statusCode)
        }
        if (err.data) {
          console.error('[购物车] 错误响应数据:', err.data)
        }
        
        // 检查是否为201创建成功但被当作错误处理的情况
        if (err.statusCode === 201 && err.data) {
          try {
            const responseData = typeof err.data === 'string' ? JSON.parse(err.data) : err.data
            console.log('[购物车] 201响应数据:', responseData)
            
            if (responseData.code === 0 && responseData.data) {
              const orderId = responseData.data.orderId || responseData.data.id
              console.log('[购物车] 从错误中恢复订单ID:', orderId)
              
              showToast('订单创建成功')
              setTimeout(() => {
                wx.navigateTo({
                  url: `/pages/order/payment/index?id=${orderId}`
                })
              }, 300)
              return
            }
          } catch (e) {
            console.error('[购物车] 解析201响应失败:', e)
          }
        }
        
        // 显示通用错误提示
        showToast('创建订单失败，请稍后再试')
      })
  },
  
  // 图片加载错误处理
  onImageError: function(e) {
    const index = e.currentTarget.dataset.index
    const cartList = this.data.cartList
    cartList[index].cover = '/static/images/default-product.png'
    this.setData({ cartList })
  }
}) 